package exercises.newcoder.solution;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * <a href="https://www.nowcoder.com/practice/0337e32b1e5543a19fa380e36d9343d7?tpId=40&&tqId=21332&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking">
 * KY30 进制转换</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
 * <p>
 * 输入描述：
 * <p>
 * 多组数据，每行为一个长度不超过30位的十进制非负整数。 （注意是10进制数字的个数可能有30个，而非30bits的整数）
 * <p>
 * 输出描述：
 * <p>
 * 每行输出对应的二进制数。
 * <p>
 * 示例1
 * <p>
 * 输入：
 * <p>
 * 0
 * 1
 * 3
 * 8
 * <p>
 * 输出：
 * <p>
 * 0
 * 1
 * 11
 * 1000
 * <p>
 *
 * @author or2
 * @date 2021年09月30日 时间: 21:53
 */
public class Graduate30 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num;
        while (!(num = scanner.nextLine()).isEmpty()) {
            String res = transform(num);
            System.out.println(res);
        }
    }

    public static void mainNewcoder(String[] args) throws IOException {
        BufferedReader scanner = new BufferedReader(new InputStreamReader(System.in));
        String num;
        while ((num = scanner.readLine()) != null) {
            String res = transform(num);
            System.out.println(res);
        }
    }

    public static String transform(String decimal) {
        char[] decChars = decimal.toCharArray();

        int length = decChars.length;
        StringBuilder builder = new StringBuilder(length * 3);

        /* 查看字符串前面 0 的个数, 同时判断结束条件 */
        int zeroPre = 0;
        while (zeroPre != length) {
            /* 完成一次 /2 运算 */
            div(decChars, zeroPre, builder);
            /* 更新 0 的个数 */
            for (int i = zeroPre; i < length; i++)
                if (decChars[i] == '0') zeroPre++;
                else break;
        }

        return builder.reverse().toString();
    }

    private static void div(char[] decChars, int zeroPre, StringBuilder builder) {
        int carry = 0;
        for (int i = zeroPre; i < decChars.length; i++) {
            /* 当前位计算 */
            int bit = decChars[i] - '0';
            /* 上一位没有被整除 */
            if (carry > 0)
                bit += 10;
            decChars[i] = (char) (bit / 2 + '0');
            carry = bit % 2;
        }
        if (carry == 1)
            builder.append(1);
        else
            builder.append(0);
    }
}
